#include <wx/combobox.h>
#include "wxscombobox.h"

#include <prep.h>

namespace {
  wxsRegisterItem<wxsComboBox> Reg( _T( "ComboBox" ), _T( "组合框" ), wxsTWidget, _T( "标准" ), 290 );
  WXS_ST_BEGIN( wxsComboBoxStyles, _T( "" ) )
  WXS_ST_CATEGORY( "wxComboBox" )
  WXS_ST( wxCB_SIMPLE )
  WXS_ST( wxCB_SORT )
  WXS_ST( wxCB_READONLY )
  WXS_ST( wxCB_DROPDOWN )
  WXS_ST( wxTE_PROCESS_ENTER )
  WXS_ST_DEFAULTS()
  WXS_ST_END()
  WXS_EV_BEGIN( wxsComboBoxEvents )
  WXS_EVI( EVT_COMBOBOX, wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEvent, Selected )
  WXS_EVI( EVT_COMBOBOX_DROPDOWN, wxEVT_COMMAND_COMBOBOX_DROPDOWN, wxCommandEvent, Dropdown )
  WXS_EVI( EVT_COMBOBOX_CLOSEUP, wxEVT_COMMAND_COMBOBOX_CLOSEUP, wxCommandEvent, CloseUp )
  WXS_EVI( EVT_TEXT, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEvent, TextUpdated )
  WXS_EVI( EVT_TEXT_ENTER, wxEVT_COMMAND_TEXT_ENTER, wxCommandEvent, TextEnter )
  WXS_EV_END()
}

wxsComboBox::wxsComboBox( wxsItemResData* Data ):
  wxsWidget( Data, &Reg.Info, wxsComboBoxEvents, wxsComboBoxStyles ), DefaultSelection( -1 ) {}

void wxsComboBox::OnBuildCreatingCode() {
  switch( GetLanguage() ) {
  case wxsCPP: {
    AddHeader( _T( "<wx/combobox.h>" ), GetInfo().ClassName, hfInPCH );
    Codef( _T( "%C(%W, %I, wxEmptyString, %P, %S, 0, 0, %T, %V, %N);\n" ) );
    for( size_t i = 0; i <  ArrayChoices.GetCount(); ++i ) {
      if( DefaultSelection == ( int )i ) {
        Codef( _T( "%ASetSelection( " ) );;
      }
      Codef( _T( "%AAppend(%t)" ), ArrayChoices[i].wx_str() );
      if( DefaultSelection == ( int )i ) {
        Codef( _T( " )" ) );
      }
      Codef( _T( ";\n" ) );
    }
    BuildSetupWindowCode();
    return;
  }
  case wxsUnknownLanguage:
  default: {
    wxsCodeMarks::Unknown( _T( "wxsComboBox::OnBuildCreatingCode" ), GetLanguage() );
  }
  }
}

wxObject* wxsComboBox::OnBuildPreview( wxWindow* Parent, long Flags ) {
  wxComboBox* Preview = new wxComboBox( Parent, GetId(), _T( "" ), Pos( Parent ), Size( Parent ), ArrayChoices, Style() );
  for( size_t i = 0; i <  ArrayChoices.GetCount(); ++i ) {
    int Val = Preview->Append( ArrayChoices[i] );
    if( ( int )i == DefaultSelection ) {
      Preview->SetSelection( Val );
    }
  }
  return SetupWindow( Preview, Flags );
}

void wxsComboBox::OnEnumWidgetProperties( M_Code_unused long Flags ) {
  WXS_ARRAYSTRING( wxsComboBox, ArrayChoices, _T( "Choices" ), _T( "content" ), _T( "item" ) )
  WXS_LONG( wxsComboBox, DefaultSelection, _T( "Selection" ), _T( "selection" ), -1 )
}
